#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "qlabelmouse.h"
#include "siteinfo.h"
#include "accountmanagemengt.h"
#include "secondaryplan.h"
#include "logwindow.h"


#include <QDebug>
#include <QMovie>
#include <QTimer>
#include <qdatetime.h>
#include <QScreen>
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowState (Qt ::WindowMaximized);


    //设置主界面时间
    QTimer *timer_date = new QTimer(this);//new一个QTimer对象,用来显示当前日期的定时器
    connect(timer_date,SIGNAL(timeout()),this,SLOT(ShowTime()));//连接槽函数
    timer_date->start(1000);//每一秒溢出一次进入槽函数  1000为毫秒单位

    //设置监测点列表
    ui->treeWidget->clear();                             //清空内容
    ui->treeWidget->headerItem()->setText(0,"检测点列表");  //设置字段
    departTree("",ui->treeWidget);                       //开始第一次插入

    //获取屏幕可使用大小尺寸
    QScreen *deskScreen = QApplication::primaryScreen();
    if(deskScreen)
    {
        QSize availableSize = deskScreen->availableVirtualSize();
        int availableWidth = availableSize.width();   //获取屏幕宽度
        int availableHeight = availableSize.height();  //获取屏幕高度
        setFixedSize(availableWidth, availableHeight);  //固定窗口大小 不能改变
    }


    //获取全部区域
    listArea = DB.showRegion();

    //获取所有站点
    listSite = DB.showSite();

    //遍历所有的点
    addDotList(listArea);

    //创建放大后的tablewidget
    widget = new QTableWidget(this);

    //隐藏警告消息按钮
    ui->pushButton_8->hide();

    //设置 下方的警告列表  表头
    setHeader(ui->wanningTableWidget);
    setHeader(widget);
    widget->hide();

    //作用警告列表的添加


    //随机制造预警
    makeWanning();
    timer.start(15000);  //十秒警报随机一次
    connect(&timer,&QTimer::timeout,[=](){
        makeWanning();
    });

    //修改页面显示
    relPage = new relievePage;
    relPage->hide();

    //连接tree的点击信号
    connect(ui->treeWidget,SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)),this,SLOT(selectHero(QTreeWidgetItem*,int)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

//创建圆点
void MainWindow::addDot(QString DotName, int x, int y)
{
    //创建圆点
    QlabelMouse *label1 = new QlabelMouse(this);

    //创建区域提示框
    siteInfo *infoFrame = new siteInfo(this);
    infoFrame->hide();

    //设置圆点样式 位置
    label1->setStyleSheet("background-color: #00ff00;border-radius:15px;");
    label1->setFixedSize(30,30);
    label1 ->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
    label1->move(x,y);

    //发送  站点区域
    connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);  //判断为同一个
    disconnect(this,&MainWindow::getSiteCommon,0,0);  //断开连接 避免多个连接 导致信息同步到最后一个连接
    connect(this,&MainWindow::getSiteCommon,infoFrame,&siteInfo::setInfoCommon);  //作用：点击正常站点 设置该站点信息
    emit getDotName(DotName);
    emit getSiteCommon(DotName);
    //显示正常站点框
    connect(label1,&QlabelMouse::moved1,[=]()mutable{
        infoFrame->move(x+30,y-100);
        infoFrame->raise();//将窗口置于顶层
        infoFrame->show();
    });

    //一级预警  作用：提示该站点有一级预警
    connect(this,&MainWindow::warning1,label1,[=](QString DotNameOne)mutable{
        //断开槽函数连接  避免发送getSite信号和其他提示框更新冲突
        disconnect(infoFrame);
        if(DotName == DotNameOne)
        {
            //统计判断里面的个数  作用：在表格插入时 可以做判断
            errorNumber[0]++;
            updateAbstract(); //更新系统运行摘要的站点数量

            //发送信号 改变提示框信息
            connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);
            connect(this,&MainWindow::getSite,infoFrame,&siteInfo::setInfo,Qt::UniqueConnection);

            //设置动图  作用：开启Qmovie，实现按钮闪烁
            getMovie(DotNameOne)->setFileName(":/res/error1.gif");
            label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
            label1->setScaledContents(true);
            if(getMovie(DotNameOne)->state() == QMovie::Running) {
                getMovie(DotNameOne)->stop();
            }
            getMovie(DotNameOne)->start(); // 2. 启动动画

            //鼠标点击事件     点击   显示消息框
            connect(label1,&QlabelMouse::moved1,[=]()mutable{
                infoFrame->move(x+30,y-100);
                infoFrame->raise();//将窗口置于顶层
                infoFrame->show();
            });
        }
    });

    //二级预警  作用：提示该站点有二级预警
    connect(this,&MainWindow::warning2,label1,[=](QString DotNameOne){
        //断开槽函数连接  避免发送getSite信号和其他提示框更新冲突
        disconnect(infoFrame);
        if(DotName == DotNameOne)
        {
            //统计判断里面的个数  作用：在表格插入时 可以做判断
            errorNumber[1]++;
            updateAbstract(); //更新系统运行摘要的站点数量


            //发送信号 改变提示框信息
            connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);
            connect(this,&MainWindow::getSite,infoFrame,&siteInfo::setInfo,Qt::UniqueConnection);

            //设置动图  作用：开启Qmovie，实现按钮闪烁
            getMovie(DotNameOne)->setFileName(":/res/error2.gif");
            label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
            label1->setScaledContents(true);
            if(getMovie(DotNameOne)->state() == QMovie::Running) {
                getMovie(DotNameOne)->stop();
            }
            getMovie(DotNameOne)->start(); // 2. 启动动画

            //鼠标移动事件     进入   显示消息框
            connect(label1,&QlabelMouse::moved1,[=]()mutable{
                infoFrame->move(x+30,y-100);
                infoFrame->raise();//将窗口置于顶层
                infoFrame->show();

            });
        }
    });

    //三级预警  作用：提示该站点有三级预警
    connect(this,&MainWindow::warning3,label1,[=](QString DotNameOne){
        //断开槽函数连接  避免发送getSite信号和其他提示框更新冲突
        disconnect(infoFrame);
        if(DotName == DotNameOne)
        {
            //统计判断里面的个数  作用：在表格插入时 可以做判断
            errorNumber[2]++;
            updateAbstract(); //更新系统运行摘要的站点数量

            //发送信号 改变提示框信息
            connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);
            connect(this,&MainWindow::getSite,infoFrame,&siteInfo::setInfo,Qt::UniqueConnection);

            //设置动图
            getMovie(DotNameOne)->setFileName(":/res/error3.gif");
            label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
            label1->setScaledContents(true);
            if(getMovie(DotNameOne)->state() == QMovie::Running) {
                getMovie(DotNameOne)->stop();
            }
            getMovie(DotNameOne)->start(); // 2. 启动动画

            //鼠标移动事件     进入   显示消息框
            connect(label1,&QlabelMouse::moved1,[=]()mutable{
                infoFrame->move(x+30,y-100);
                infoFrame->raise();//将窗口置于顶层
                infoFrame->show();
            });
        }
    });

    //解除预警信号  作用：把闪烁警报恢复成绿色  关闭提示框
    connect(infoFrame,&siteInfo::relieve,[=](QString DotNameOne,int errorCategory,QString siteName){
        if(DotName == DotNameOne)
        {
            relPage->show();
            //成功解除一个站点的警报
            connect(this,&MainWindow::relieveChange,relPage,&relievePage::changPage);
            emit relieveChange( DotNameOne, siteName, errorCategory);
            connect(relPage,&relievePage::checkingSuccess,this,[=](){
                //把闪烁警报恢复成绿色
                getMovie(DotNameOne)->stop();
                getMovie(DotNameOne)->setFileName(":/res/green.gif");
                label1->setMovie(getMovie(DotNameOne));
                getMovie(DotNameOne)->start(); // 2. 启动动画
                getMovie(DotNameOne)->stop();

                //关闭提示框
                infoFrame->close();
                //更新报警站点的地方
                errorMap.remove(siteName);
                //更新运行摘要
                --errorNumber[errorCategory];
                updateAbstract();
                //更新警告列表
                updateTable(siteName,errorCategory);
                //更新列表信息  恢复正常
                updateTreeToNormal(siteName);
                //断开鼠标移动到Qlabel产生提示框的信号与槽
                disconnect(label1,&QlabelMouse::moved1,0,0);
                disconnect(relPage,&relievePage::checkingSuccess,0,0);
                //判断该区域是否还有其他报警站点
                int number = 0; //判断该区域是否还有其他报警站点的数量
                for(int i = 0 ; i<listSite.size();i++)
                {
                    if(listSite[i][1]==DotNameOne)
                    {
                        if(errorMap.contains(listSite[i][0]))//该区域是否还有其他报警站点
                        {
                            number++;
                            int otherErrorCategory = errorMap.value(listSite[i][0]);
                            WanningType type=wanning_1;
                            QString time;
                            switch (otherErrorCategory)
                            {
                            case 0:
                                type= wanning_1;
                                //设置动图
                                getMovie(DotNameOne)->setFileName(":/res/error1.gif");
                                label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
                                label1->setScaledContents(true);
                                if(getMovie(DotNameOne)->state() == QMovie::Running) {
                                    getMovie(DotNameOne)->stop();
                                }
                                getMovie(DotNameOne)->start(); // 2. 启动动画
                                break;
                            case 1:
                                type= wanning_2;
                                //设置动图
                                getMovie(DotNameOne)->setFileName(":/res/error2.gif");
                                label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
                                label1->setScaledContents(true);
                                if(getMovie(DotNameOne)->state() == QMovie::Running) {
                                    getMovie(DotNameOne)->stop();
                                }
                                getMovie(DotNameOne)->start(); // 2. 启动动画
                                break;
                            case 2:
                                type= wanning_3;
                                //设置动图
                                getMovie(DotNameOne)->setFileName(":/res/error3.gif");
                                label1->setMovie(getMovie(DotNameOne)); // 1. 设置要显示的 GIF 动画图片
                                label1->setScaledContents(true);
                                if(getMovie(DotNameOne)->state() == QMovie::Running)
                                {
                                    getMovie(DotNameOne)->stop();
                                }
                                getMovie(DotNameOne)->start(); // 2. 启动动画
                                break;

                            }
                            int rC = ui->wanningTableWidget->rowCount();//获得行数
                            for (int j = 0; j < rC; j++)
                            {
                                if(!(ui->wanningTableWidget->item(j,1)->text().contains(listSite[i][0])))
                                {
                                    QTableWidgetItem* item = ui->wanningTableWidget->item(j,3);
                                    time= item->text();
                                }
                            }
                            //发送信号 显示之前的信息
                            connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);
                            connect(this,&MainWindow::getSite,infoFrame,&siteInfo::setInfo,Qt::UniqueConnection);
                            emit getDotName(DotName);
                            emit getSite(listSite[i][0],DotName,type,time);
                            connect(label1,&QlabelMouse::moved1,[=]()mutable{
                                infoFrame->move(x+30,y-100);
                                infoFrame->raise();//将窗口置于顶层
                                infoFrame->show();

                            });
                        }
                    }
                }

                //如果该区域没有其他报警点 则显示普通框
                if(!number)
                {
                    //发送  站点区域
                    connect(this,&MainWindow::getDotName,infoFrame,&siteInfo::theSame);  //判断为同一个
                    disconnect(this,&MainWindow::getSiteCommon,0,0);  //断开连接 避免多个连接 导致信息同步到最后一个连接
                    connect(this,&MainWindow::getSiteCommon,infoFrame,&siteInfo::setInfoCommon);  //作用：点击正常站点 设置该站点信息
                    emit getDotName(DotNameOne);
                    emit getSiteCommon(DotNameOne);

                    connect(label1,&QlabelMouse::moved1,[=]()mutable{
                        infoFrame->move(x+30,y-100);
                        infoFrame->raise();//将窗口置于顶层
                        infoFrame->show();

                    });
                }


            });
            //解除预警信号   写入日志
            connect(relPage,&relievePage::log,this,[=](QString record){
                QDateTime time1 = QDateTime::currentDateTime();
                QString dateTime = time1.toString("yyyy-MM-dd");
                QString dateTime1 = time1.toString("yyyy-MM-dd hh:mm:ss");
                QString str= QString("Data_%1.xml").arg(dateTime);

                QFile m_file(str);
                if (!m_file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
                {
                    qDebug()<<"write open false";
                    return;
                }
                QTextStream out(&m_file);
                out.setCodec("UTF-8");
                qDebug()<<"write open true";
                QDomDocument domDoc;
                QDomProcessingInstruction version;
                version=domDoc.createProcessingInstruction("xml","version = \"1.0\" encoding = \"UTF-8\"");
                domDoc.appendChild(version);
                //创建顶节点
                QDomElement domRootElement = domDoc.createElement("Test");
                domDoc.appendChild(domRootElement);
                //创建父节点
                QDomElement itemRootElement =domDoc.createElement("data");
                {
                    QDomElement node_1=domDoc.createElement("SiteName");
                    QDomText domText_1=domDoc.createTextNode("SiteName");
                    domText_1.setData(siteName);
                    node_1.appendChild(domText_1);
                    itemRootElement.appendChild(node_1);

                    QDomElement node_2=domDoc.createElement("Region");
                    QDomText domText_2=domDoc.createTextNode("Region");
                    domText_2.setData(DotNameOne);
                    node_2.appendChild(domText_2);
                    itemRootElement.appendChild(node_2);

                    QString DeviceID=DB.queryDeviceID(siteName);
                    QDomElement node_3=domDoc.createElement("DeviceID");
                    QDomText domText_3=domDoc.createTextNode("DeviceID");
                    domText_3.setData(DeviceID);
                    node_3.appendChild(domText_3);
                    itemRootElement.appendChild(node_3);

                    QString errorCategory1=QString::number(errorCategory);
                    QDomElement node_4=domDoc.createElement("EventType");
                    QDomText domText_4=domDoc.createTextNode("EventType");
                    domText_4.setData(errorCategory1);
                    node_4.appendChild(domText_4);
                    itemRootElement.appendChild(node_4);

                    relievePage *rFrame = new relievePage;
                    connect(rFrame,SIGNAL(sendEventDescription(QString)),this,SLOT(recvEventDescription(QString)));
                    QDomElement node_5=domDoc.createElement("EventDescription");
                    QDomText domText_5=domDoc.createTextNode("EventDescription");
                    domText_5.setData(record);
                    node_5.appendChild(domText_5);
                    itemRootElement.appendChild(node_5);

                    QDomElement node_6=domDoc.createElement("OccurrenceTime");
                    QDomText domText_6=domDoc.createTextNode("OccurrenceTime");
                    domText_6.setData(dateTime1);
                    node_6.appendChild(domText_6);
                    itemRootElement.appendChild(node_6);

                    QDomElement node_7=domDoc.createElement("Operator");
                    QDomText domText_7=domDoc.createTextNode("Operator");
                    domText_7.setData(Root);
                    node_7.appendChild(domText_7);
                    itemRootElement.appendChild(node_7);

                }
                domRootElement.appendChild(itemRootElement);
                m_file.write(domDoc.toString().toLocal8Bit().data());
                m_file.close();
            });

        }
    });
}

//向tablewidget添加数据
void MainWindow::createItemsARow(QString siteName, QString DotName, MainWindow::WanningType errorCategory, QString time,QTableWidget *Widget)
{
    QTableWidgetItem  *item;
    QString wanningType;
    int perRow; //指明不同警告级别插入的位置

    //判断如果报警数超过两个 就显示列表按钮
    if(Widget->rowCount()>=2)
    {
        ui->pushButton_8->show();
    }


    //判断不同警告级别插入的位置
    if(errorCategory == 2) //当为三级警告
    {
        perRow = 0;
    }
    else if(errorCategory == 1) //当为二级警告
    {
        perRow = errorNumber[2];
    }
    else   //当为一级警告
    {
        perRow = errorNumber[2]+errorNumber[1];
    }
    Widget->insertRow(perRow);
    //添加区域单元格
    item=new  QTableWidgetItem(DotName,0);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
    item->setFlags(Qt::ItemIsEnabled); //表格单元item不可编辑
    Widget->setItem(perRow,0,item); //为单元格设置Item


    //添加站点单元格
    item=new  QTableWidgetItem(siteName,MainWindow::colSite);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
    item->setFlags(Qt::ItemIsEnabled); //表格单元item不可编辑
    Widget->setItem(perRow,MainWindow::colSite,item); //为单元格设置Item


    //添加报警类型
    switch (errorCategory) {
    case 0:
        wanningType = "01 一级预警（80℃）";
        break;
    case 1:
        wanningType = "02 二级预警（120℃）";
        break;
    case 2:
        wanningType = "03 三级预警（160℃）";
        break;
    }
    item=new  QTableWidgetItem(wanningType,MainWindow::colWanning);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
    item->setFlags(Qt::ItemIsEnabled); //表格单元item不可编辑
    Widget->setItem(perRow,MainWindow::colWanning,item); //为单元格设置Item


    //添加报警时间
    item=new  QTableWidgetItem(time,MainWindow::colTime);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); //文本对齐格式
    item->setFlags(Qt::ItemIsEnabled); //表格单元item不可编辑
    Widget->setItem(perRow,MainWindow::colTime,item); //为单元格设置Item


    //不能超过半屏
    if(widget->rowCount()<13)
    {
        widget->setFixedSize(943,widget->rowCount()*30+30);//设置放大后大小
        widget->setWindowFlags (Qt::FramelessWindowHint|Qt::CustomizeWindowHint);//嵌入父页面
        widget->move(209,680-widget->rowCount()*30);//移动到具体位置
    }

    //产生的警报 写入日志里面
    QDateTime time1 = QDateTime::currentDateTime();
    QString dateTime = time1.toString("yyyy-MM-dd");
    QString str= QString("Data1_%1.xml").arg(dateTime);

    QFile m_file(str);
    if (!m_file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
    {
        qDebug()<<"write open false";
        return;
    }
    QTextStream out(&m_file);
    out.setCodec("UTF-8");
    qDebug()<<"write open true";
    QDomDocument domDoc;
    QDomProcessingInstruction version;
    version=domDoc.createProcessingInstruction("xml","version = \"1.0\" encoding = \"UTF-8\"");
    domDoc.appendChild(version);
    //创建顶节点
    QDomElement domRootElement = domDoc.createElement("Test");
    domDoc.appendChild(domRootElement);
    //创建父节点
    QDomElement itemRootElement =domDoc.createElement("data");
    {
        QDomElement node_1=domDoc.createElement("SiteName");
        QDomText domText_1=domDoc.createTextNode("SiteName");
        domText_1.setData(siteName);
        node_1.appendChild(domText_1);
        itemRootElement.appendChild(node_1);

        QDomElement node_2=domDoc.createElement("Region");
        QDomText domText_2=domDoc.createTextNode("Region");
        domText_2.setData(DotName);
        node_2.appendChild(domText_2);
        itemRootElement.appendChild(node_2);

        QString DeviceID=DB.queryDeviceID(siteName);
        QDomElement node_3=domDoc.createElement("DeviceID");
        QDomText domText_3=domDoc.createTextNode("DeviceID");
        domText_3.setData(DeviceID);
        node_3.appendChild(domText_3);
        itemRootElement.appendChild(node_3);

        QString errorCategory1=QString::number(errorCategory);
        QDomElement node_4=domDoc.createElement("EventType");
        QDomText domText_4=domDoc.createTextNode("EventType");
        domText_4.setData(errorCategory1);
        node_4.appendChild(domText_4);
        itemRootElement.appendChild(node_4);

        relievePage *rFrame = new relievePage;
        connect(rFrame,SIGNAL(sendEventDescription(QString)),this,SLOT(recvEventDescription(QString)));
        QDomElement node_5=domDoc.createElement("EventDescription");
        QDomText domText_5=domDoc.createTextNode("EventDescription");
        domText_5.setData(EventDescriptiondata1);
        node_5.appendChild(domText_5);
        itemRootElement.appendChild(node_5);

        QDomElement node_6=domDoc.createElement("OccurrenceTime");
        QDomText domText_6=domDoc.createTextNode("OccurrenceTime");
        domText_6.setData(dateTime);
        node_6.appendChild(domText_6);
        itemRootElement.appendChild(node_6);

        QDomElement node_7=domDoc.createElement("Operator");
        QDomText domText_7=domDoc.createTextNode("Operator");
        domText_7.setData(" ");
        node_7.appendChild(domText_7);
        itemRootElement.appendChild(node_7);

    }
    domRootElement.appendChild(itemRootElement);
    m_file.write(domDoc.toString().toLocal8Bit().data());
    m_file.close();

}

//随机出错
void MainWindow::makeWanning()
{
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
    int test = qrand()%300;//随机的报警模式
    int site = qrand()%listSite.count();//随机站点报警

    errorSiteList.append(listSite.at(site).at(0));//添加错误站点

    qDebug()<<"报警站点为："<<listSite.at(site).at(0)<<"    所属区域为："<<listSite.at(site).at(1);
    QString current_date_time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");
    //判断 如果随机数>100 为1级警告  >200为二级警告   >300为三级警告
    if(test<100)
    {
        emitWanning(listSite.at(site).at(0), listSite.at(site).at(1),wanning_1 ,current_date_time);
        return;
    }
    else if(test<200)
    {
        emitWanning(listSite.at(site).at(0), listSite.at(site).at(1),wanning_2 ,current_date_time);
        return;
    }
    else if(test<300)
    {
        //三级警报
        emitWanning(listSite.at(site).at(0), listSite.at(site).at(1),wanning_3 ,current_date_time);
        return;
    }
    else
    {
        return;
    }

}

//随机产生告警发送信号  作用：封装，减少代码量
void MainWindow::emitWanning(QString siteName, QString DotName, WanningType errorType, QString time)
{
    int number = 0;
    QMap<QString, int>::const_iterator iterator_1 = errorMap.constBegin();
    while (iterator_1 != errorMap.constEnd()) {
        if(iterator_1.key()==siteName)
        {
            number++;
            if(iterator_1.value()<errorType)
            {
                updateTable(iterator_1.key(),iterator_1.value()); //删除同一个站点之前更小的警报
                errorMap.insert(siteName,errorType);
                switch (errorType)
                {
                case 0:emit warning1(DotName) ; break;
                case 1:emit warning2(DotName);break;
                case 2:emit warning3(DotName);break;
                }
                emit getDotName(DotName);
                emit getSite(siteName,DotName,errorType,time);
                updateTreeToRed(siteName); //异常变红
                on_pushButton_7_clicked(true); //异常变红数量
            }
        }
        ++iterator_1;
    }
    if(!number)
    {
        errorMap.insert(siteName,errorType);
        switch (errorType)
        {
        case 0:emit warning1(DotName) ; break;
        case 1:emit warning2(DotName);break;
        case 2:emit warning3(DotName);break;
        }
        emit getDotName(DotName);
        emit getSite(siteName,DotName,errorType,time);
        updateTreeToRed(siteName); //异常变红
        on_pushButton_7_clicked(true);//异常变红数量
        //更新警告列表
        ui->wanningTableWidget->setRowCount(rowNo);//设置表格行数
        widget->setRowCount(rowNo);
        createItemsARow( siteName, DotName,errorType, time,ui->wanningTableWidget);
        createItemsARow( siteName, DotName,errorType, time,widget);
        rowNo++;
    }
}

//设置表头
void MainWindow::setHeader(QTableWidget *tablewidget)
{
    //设置表头
    QTableWidgetItem  *headerItem;
    QStringList headerText;
    headerText<<"区域"<<"监测站点"<<"警报类别"<<"告警时间";
    tablewidget->setColumnCount(4);//列数设置为与 headerText的行数相等
    for (int i=0;i<tablewidget->columnCount();i++)//列编号从0开始
    {
        headerItem=new QTableWidgetItem(headerText.at(i)); //headerText.at(i)获取headerText的i行字符串
        tablewidget->setHorizontalHeaderItem(i,headerItem); //设置表头单元格的Item
    }
    tablewidget->horizontalHeader()-> setSectionResizeMode (QHeaderView::Stretch);
    tablewidget->horizontalHeader()->setStyleSheet ("QHeaderView::section {background-color:skyblue}");
}

//初始化主页面的圆点
void MainWindow::addDotList(QList<QList<QString>> listArea1)
{
    for(int i= 0 ; i <listArea1.count();i++)
    {
        //解析坐标
        QStringList coordinate = listArea1.at(i).at(1).split(",");
        QMovie dotMovie;
        int x = coordinate.at(0).toInt();
        int y = coordinate.at(1).toInt();
        //添加点 addDot(区域名称，区域x坐标，区域y坐标)
        addDot(listArea1.at(i).at(0),x,y);
    }

}

//获取具体的QMovie
QMovie* MainWindow::getMovie(QString DotNameOne)
{
    if(DotNameOne.contains("原料厂",Qt::CaseSensitive))
    {
        return movie1;
    }
    else if(DotNameOne.contains("研究所",Qt::CaseSensitive))
    {
        return movie2;
    }
    else if(DotNameOne.contains("陶瓷基地",Qt::CaseSensitive))
    {
        return movie3;
    }
    else if(DotNameOne.contains("建材基地",Qt::CaseSensitive))
    {
        return movie4;
    }
    else if(DotNameOne.contains("大楼",Qt::CaseSensitive))
    {
        return movie5;
    }
    else if(DotNameOne.contains("车间1",Qt::CaseSensitive))
    {
        return movie6;
    }
    else if(DotNameOne.contains("车间2",Qt::CaseSensitive))
    {
        return movie7;
    }
    else if(DotNameOne.contains("车间3",Qt::CaseSensitive))
    {
        return movie8;
    }
    else if(DotNameOne.contains("职工宿舍",Qt::CaseSensitive))
    {
        return movie9;
    }
    else
    {
        return 0;
    }
}

//重写鼠标事件  作用：点击旁边空白区域，关闭半屏
void MainWindow::mousePressEvent(QMouseEvent *ev)
{
    widget->hide();
    emit mousePressEvent1();
}

//tablewidget放大缩小操作
void MainWindow::on_pushButton_8_clicked(bool checked)
{
    if(widget->isHidden())
    {
        widget->show();//显示
    }
    else
    {
        widget->hide();//隐藏
    }
}

//显示监测点子列表
void MainWindow::departTree(QString root, QTreeWidgetItem *item)
{
    QSqlQuery query;
    query.exec("select* from MonitoringSite where id='"+root+"'"); //设置查询语句
    while (query.next())
    {
        QString siteName = query.value(0).toString(); //获取部门名称
        QString HOUSE_ID = query.value(1).toString();   //获取部门ID
        QTreeWidgetItem *items =
                new QTreeWidgetItem(item,QStringList(QString(siteName)));
        /*创建新的ITEM,插入到ITEM中，设置名称为当前查询到的部门名称*/
        if(!siteName.isEmpty())
        {
            departTree(HOUSE_ID,items);  //递归，若传入查询到的部门，判断是否还有下级
        }
    }
    return;
}

//显示监测点列表
void MainWindow::departTree(QString root, QTreeWidget *tree)
{
    QSqlQuery query;
    query.exec("select *from MonitoringArea");
    while (query.next())
    {
        QString areaName = query.value(0).toString();
        QString HOUSE_ID = query.value(3).toString();
        QTreeWidgetItem *item =
                new QTreeWidgetItem(tree,QStringList(QString(areaName)));
        if(!areaName.isEmpty())
        {
            departTree(HOUSE_ID,item);   //递归，若传入查询到的部门，判断是否还有下级
        }
    }
    return;
}

//更新系统运行摘要
void MainWindow::updateAbstract()
{

    ui->listWidget_abstract->item(1)->setText("一级预警站点："+QString::number(errorNumber[0]));
    ui->listWidget_abstract->item(2)->setText("二级预警站点："+QString::number(errorNumber[1]));
    ui->listWidget_abstract->item(3)->setText("三级预警站点："+QString::number(errorNumber[2]));
    ui->listWidget_abstract->item(4)->setText("报警站点数量："+QString::number(errorNumber[0]+errorNumber[1]+errorNumber[2]));


}

//更新警告列表信息
void MainWindow::updateTable(QString siteName, int errorCategory)
{
    QList<QTableWidgetItem*> findItems = ui->wanningTableWidget->findItems(siteName, Qt::MatchContains);

    if(findItems.isEmpty())
    {
        return;
    }

    int nRow = ui->wanningTableWidget->rowCount();
    for(int i = 0; i < nRow; ++i)
    {
        foreach(QTableWidgetItem* item, findItems)
        {
            if(NULL == item) continue;
            if(ui->wanningTableWidget->row(item) == i)
            {
                rowNo--;
                ui->wanningTableWidget->removeRow (i);  //去除一行
                widget->removeRow (i);//去除一行
                break;
            }
        }
    }
}

//更新列表信息  异常的变红
void MainWindow::updateTreeToRed(QString siteName)
{
    QTreeWidgetItemIterator it(ui->treeWidget);
    while (*it) {
        //do something like
        if((*it)->text(0)==siteName)
        {
            (*it)->setTextColor(0,Qt::red);
        }
        ++it;
    }
}

//更新列表信息  恢复正常
void MainWindow::updateTreeToNormal(QString siteName)
{

    QTreeWidgetItemIterator it(ui->treeWidget);
    while (*it) {
        //do something like
        if((*it)->text(0)==siteName)
        {
            (*it)->setTextColor(0,Qt::black);//颜色恢复正常
            (*it)->setHidden(true); //隐藏
        }
        ++it;
    }

}

//获取登录用户
void MainWindow::getRoot(QString root)
{
    Root  = root;
}

//label显示时间
void MainWindow::ShowTime()
{
    ui->label_8->setText(QDateTime::currentDateTime().toString("hh:mm:ss"));//时/分/秒
    QFont font=QFont("Microsoft Yahei",14,25);//第一个属性是字体（微软雅黑），第二个是大小，第三个是加粗（权重是25）
    ui->label_8->setFont(font);
    ui->label_9->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd  "));//年/月/日
    ui->label_10->setText(QDateTime::currentDateTime().toString("ddd"));//星期
}

//账户管理按钮
void MainWindow::on_pushButton_clicked()
{
    AccountManagemengt *A=new AccountManagemengt;
    A->show();
}

//treewidget展开
void MainWindow::on_pushButton_5_clicked()
{
    ui->treeWidget->expandAll();
}

//treewidget收起
void MainWindow::on_pushButton_6_clicked()
{
    ui->treeWidget->collapseAll();
}

//只显示异常站点
void MainWindow::on_pushButton_7_clicked(bool checked)
{
    if(checked)
    {
        QTreeWidgetItemIterator it(ui->treeWidget);
        while (*it)
        {
            (*it)->setHidden(true);
            //不隐藏区域
            for(int i =0; i<listArea.size();i++)
            {
                if(listArea.at(i).at(0)==(*it)->text(0))
                {
                    (*it)->setHidden(false);
                }
            }
            //显示异常站点
            if(errorMap.contains((*it)->text(0)))
            {
                (*it)->setHidden(false);
            }
            //            for(int i =0; i<errorSiteList.size();i++)
            //            {
            //                if(errorSiteList[i]==(*it)->text(0))
            //                {
            //                    (*it)->setHidden(false);
            //                }
            //            }
            ++it;

        }
    }
    else
    {
        QTreeWidgetItemIterator it(ui->treeWidget);
        while (*it)
        {
            (*it)->setHidden(false);
            ++it;
        }
    }
}

// treewidget 双击信号  作用：弹出二级平面图
void MainWindow::selectHero(QTreeWidgetItem *item, int)
{
    secondaryPlan *itemName = new secondaryPlan;

    //判断是父节点 则不显示平面二级图
    for(int i = 0 ; i<listArea.size();i++)
    {
        if(item->text(0) == listArea[i].at(0))
            return;
    }
    //显示二级平面图
    itemName->show();
    //作用：更改二级平面图信息
    connect(this,&MainWindow::secPlanChange,itemName,&secondaryPlan::setInfoCommon);
    emit secPlanChange(item->parent()->text(0),item->text(0));
}

void MainWindow::on_pushButton_3_clicked()
{
    LogWindow *log=new LogWindow;
    log->show();
}
